<!DOCTYPE html>
<html>

<head>
	<meta charset="utf-8">
	<title></title>
</head>

<body>
	<script type="text/javascript">
		//什么是原型链?-实例对象(new出的对象)与原型之间的连接关系
		/*
		原型链概念:在获取对象属性时，如果对象本身没有这个属性，那就会去他的原型__proto__上去找，如果还查不到，就去找原型的原型，一直找到最顶层(Object.prototype)为止。Object.prototype对象也有__proto__属性值为null。
 
		简版总结：
			原型是我们创建函数的时候，系统帮我们自动生成的一个对象。 主要作用是解决构造函数内部方法内存资源浪费问题。在开发中我们一般把实例对象一些通用的方法放入原型中，在 vue 里面有时候也会给 vue 的原型添加一些公共类方法来实现所有的组件中可以共享成员。像一些常见的$router和$store 都是挂载到 vue 的原型上的。
		
			原型链是 js 对象一种查找机制，遵循就近原则。当我们访问一个对象中的成员的时候，会优先访问自己的，如果自己没有就访问原型的，如果原型也没有就会访问原型的原型，直到原型链的终点 null. 如果还没有，此时属性就会获取 undefined，方法就会报错 xxx is not a function。一般原型链主要是用来实现面向对象继承的 
		*/

		// 一.js的内置对象
		var arr = [1, 2]; //字面量方式
		var json = {}
		var arr1 = new Array(1, 2); //实例化方式,new Array，new的是构造函数。得到的var 变量叫对象。
		var str = ''
		console.log(26, arr, arr1);
		//1.0 对象下有属性constructor，可得到构造函数 。
		// console.log(28,arr.constructor,arr1.constructor); //Array  
		// console.log(json.constructor) //Object
		// console.log(str.constructor) //String

		//查看构造函数原型上的方法
		// console.log(26, Array.prototype)//构造函数原型上是方法
		// console.log(25, String.prototype)//构造函数原型上是方法
		// console.log(28, Object.prototype)//构造函数原型上是方法

		// //对象上都有一个隐式属性 __proto__ ，可以得对象的方法
		console.log(30, arr.__proto__)


		// // //1.1 构造函数有显示属性prototype,对象有隐式属性 __proto__。它们是相等的
		// let arr2=[]
		// console.log(42, Array.prototype == arr2.__proto__) //true

		// //1.2 js中所有的都是对象-从你父级找到你爷爷
		console.log(37, Array.prototype.__proto__);
		console.log(38, Object.prototype)
		console.log(41, Array.prototype.__proto__ == Object.prototype)//true

		var obj = {}
		console.log(Array.prototype.__proto__ == obj.__proto__)//true

		// //1.3 万物为空  最终都会找到null
		console.log(Object.prototype.__proto__ == null) //true


		/*   // 总结：
		  // 原型链:实例对象(new出的对象)与原型之间的连接的关系，内部真正靠__proto__( 隐式原型 )实现的。
		 0.构造函数获取：new对象.constructor   可获取构造函数
		  1.对象有属性：new对象.__proto__       可获取对象下属性与方法
		  2.构造函数有属性: Array.prototype, 可获取对象下属性与方法
		  3.js一切皆为对象：Array.prototype.__proto__   可找到父级对象下属性与方法 Object.prototype
		  4.而对象Object.prototype.__proto__最终会找到空null
		  */
		/*
		javascript原型与原型链面试题总结:	 
		1. prototype
		每个函数都有一个prototype属性，被称为显示原型
		Array.prototype
		2.__proto__
		每个实例对象都会有__proto__属性,其被称为隐式原型
		arr.__proto__
		每一个实例对象的隐式原型__proto__属性指向自身构造函数的显式原型prototype
		Array.prototype==arr.__proto__
		3. constructor
		每个对象 prototype原型都有一个constructor属性，指向它关联的构造函数。
		arr.constructor  
		4. 原型链
		获取对象属性时，如果对象本身没有这个属性，那就会去他的原型__proto__上去找，如果还查不到，就去找原型的原型，一直找到最顶层(Object.prototype)为止。Object.prototype对象也有__proto__属性值为null 
		Array.prototype.__proto__==Object.prototype  , Object.prototype.__proto__==null
		*/


	</script>
</body>

</html>